package com.audio;

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;

import java.io.File;


/**
 * mp3和wav互相转换
 */
public class AudioFormatConverter {

    /**
     * 转换音频格式
     *
     * @param inputFilePath  输入音频文件路径
     * @param outputFilePath 输出音频文件路径
     * @param outputFormat   输出音频格式（"wav" 或 "mp3"）
     * @throws Exception 如果转换失败
     */
    public static void convertAudioFormat(String inputFilePath, String outputFilePath, String outputFormat) throws Exception {
        // 确保输出文件所在的目录存在，如果不存在则创建
        File outputFile = new File(outputFilePath);
        File outputDirectory = outputFile.getParentFile();
        if (!outputDirectory.exists()) {
            boolean created = outputDirectory.mkdirs();
            if (!created) {
                throw new Exception("无法创建输出目录: " + outputDirectory.getAbsolutePath());
            }
        }

        // 初始化音频抓取器
        try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath)) {
            grabber.start();

            // 初始化音频录制器
            try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFilePath, grabber.getAudioChannels())) {
                recorder.setSampleRate(grabber.getSampleRate()); // 设置采样率
                recorder.setAudioBitrate(192000); // 设置音频比特率（192 kbps）

                if (outputFormat.equalsIgnoreCase("wav")) {
                    recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE); // 设置 WAV 格式的 PCM 编码
                    recorder.setFormat("wav"); // 设置输出格式为 WAV
                } else if (outputFormat.equalsIgnoreCase("mp3")) {
                    recorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3); // 设置 MP3 编码器
                    recorder.setFormat("mp3"); // 设置输出格式为 MP3
                } else {
                    throw new IllegalArgumentException("Unsupported output format: " + outputFormat);
                }

                recorder.start();

                // 转换音频帧
                while (true) {
                    var frame = grabber.grabFrame();
                    if (frame == null) {
                        break;
                    }
                    if (frame.samples != null) { // 确保是音频帧
                        recorder.recordSamples(frame.samples);
                    }
                }

                // 停止并释放资源
                recorder.stop();
                recorder.release();
            }
            grabber.stop();
            grabber.release();
        }
    }

    public static void main(String[] args) {
        try {
            // 输入文件路径
            String inputFile = "C:\\Users\\27452\\Desktop\\AudioDemo\\src\\main\\resources\\static\\testTemplate\\test.mp3"; // 输入 MP3 或 WAV 文件路径
            // 输出文件路径
            String outputFile = "C:\\Users\\27452\\Desktop\\AudioDemo\\src\\main\\resources\\static\\out\\test.wav"; // 输出文件路径，支持 .wav 或 .mp3

            // 指定输出格式
            String outputFormat1 = "wav"; // 可设置为 "wav" 或 "mp3"
            String outputFormat2 = "mp3"; // 可设置为 "wav" 或 "mp3"

            // 调用转换方法
            convertAudioFormat(inputFile, outputFile, outputFormat1);

            System.out.println("音频格式转换完成！");
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("音频格式转换失败: " + e.getMessage());
        }
    }
}
